package com.uniandes.edu.co.procesar.ciclo;

import java.util.LinkedList;
import java.util.List;

import com.uniandes.edu.co.anotaciones.LogD;
import com.uniandes.edu.co.anotaciones.LogT;
import com.uniandes.edu.co.anotaciones.LogsD;
import com.uniandes.edu.co.anotaciones.LogsT;
import com.uniandes.edu.co.dto.Ciclo;
import com.uniandes.edu.co.dto.Interrupcion;
import com.uniandes.edu.co.dto.EtapasDesarrollo;
import com.uniandes.edu.co.dto.Requerimiento;
import com.uniandes.edu.co.excepciones.ExcepcionExiste;
/**
 * Esta Clase realiza ejecuta toda la logica de negocio perteneciente al ciclo
 * @author Carlos Santos
 *
 */
public class ProcesarCiclo {

	@LogsD({@LogD(etapa=EtapasDesarrollo.INSPECCION, tipo=23, idCiclo=2, idPersona=20112)})
	@LogsT({@LogT(date="21/03/2011", taskId=222, idCiclo=2, idPersona=20112, porcentajeRealValorGanado=1, min=2)})
	static private ProcesarCiclo solitario = null;
	/**
	 * Metodo solitario
	 * @return la instancia de la clase ProcesarCiclo
	 */
	@LogsD({@LogD(etapa=EtapasDesarrollo.INSPECCION, tipo=22, idCiclo=2, idPersona=20112)})
	@LogsT({@LogT(date="21/03/2011", taskId=222, idCiclo=2, idPersona=20112, porcentajeRealValorGanado=1, min=2)})
	static public ProcesarCiclo getSingleton() {
		if (solitario == null) {
			solitario = new ProcesarCiclo();
		}
		return solitario;
	}
	/**
	 * Buscar un requerimiento dentro de una lista de requerimientos
	 * @param idRequerimiento Id del requerimiento a buscar
	 * @param listado Lustado de requerimientos
	 * @return El requerimiento buscado
	 */
	@LogsT({@LogT(date="21/03/2011", taskId=222, idCiclo=2, idPersona=20112, porcentajeRealValorGanado=1, min=2)})
	public Requerimiento buscarRequerimiento(String idRequerimiento, LinkedList<Requerimiento> listado)
	{
		for (int i = 0; i < listado.size(); i++) {
			if (listado.get(i).getIdRequerimiento().equals(idRequerimiento)) {
				return listado.get(i);
			}
		}
		return null;
	}
	

	@LogsT({@LogT(date="21/03/2011", taskId=222, idCiclo=2, idPersona=20112, porcentajeRealValorGanado=1, min=4)})
	public Ciclo buscarCiclo(int idCiclo,List<Ciclo> listado)
	{
		for (int i = 0; i < listado.size(); i++) {
			if (idCiclo==(listado.get(i).getIdCiclo())) {
				return listado.get(i);
			}
			
		}
		return null;
	}
	
	/**
	 * Modifica un ciclo 
	 * @param idCiclo Id del ciclo a modificar
	 * @param planDesarrollo Nuevo plan de desarrollo
	 * @param estrategia Nueva estrategia
	 * @param listado Listado de ciclos
	 */
	@LogsT({@LogT(date="21/03/2011", taskId=222, idCiclo=2, idPersona=20112, porcentajeRealValorGanado=1, min=2)})
	@LogsD({@LogD(etapa=EtapasDesarrollo.PRUEBAS, tipo=22, idCiclo=2, idPersona=20115)})
	public void modificarCiclo(int idCiclo, String estrategia, String planDesarrollo,List<Ciclo> listado)
	{
		Ciclo ciclo=buscarCiclo(idCiclo, listado);
		ciclo.setPlanDesarrollo(planDesarrollo);
		ciclo.setEstrategia(estrategia);
	}

	/**
	 * Agrega un nuevo requerimiento a la lista de requerimientos 
	 * @param idRequerimiento Id del re0uqerimiento a agregar
	 * @param descripcion Descripcion del requerimiento
	 * @param listadoRequerimiento Listado de requerimientos
	 * @throws ExcepcionExiste Si el requerimiento ya existe
	 */
	@LogsT({@LogT(date="21/03/2011", taskId=222, idCiclo=2, idPersona=20112, porcentajeRealValorGanado=1, min=2)})
	public void agregarRequerimientos(String idRequerimiento,String descripcion, LinkedList<Requerimiento> listadoRequerimiento) throws ExcepcionExiste
	{
		Requerimiento requerimiento=new Requerimiento(idRequerimiento, descripcion);
		listadoRequerimiento.add(requerimiento);
	}
	
	/**
	 * Modifica un requerimiento
	 * @param idRequerimiento Id del requerimiento a modificar
	 * @param descripcion Descripcion del requerimiento
	 * @param listadoRequerimiento Listado de requerimientos
	 */
	@LogsT({@LogT(date="21/03/2011", taskId=222, idCiclo=2, idPersona=20112, porcentajeRealValorGanado=1, min=2)})
	public void modificarRequerimientos(String idRequerimiento,String descripcion, LinkedList<Requerimiento> listadoRequerimiento) 
	{
		buscarRequerimiento(idRequerimiento, listadoRequerimiento).setDetalleRequerimiento(descripcion);
	}
	
	/**
	 * Elimina un requerimiento
	 * @param idRequerimiento Id del requerimiento
	 * @param listadoRequerimiento Listado de requerimientos
	 */
	@LogsT({@LogT(date="21/03/2011", taskId=222, idCiclo=2, idPersona=20112, porcentajeRealValorGanado=1, min=2)})
	public void eliminarRequerimientos(String idRequerimiento, LinkedList<Requerimiento> listadoRequerimiento)
	{
		for (int i = 0; i < listadoRequerimiento.size(); i++) {
			if (listadoRequerimiento.get(i).getIdRequerimiento().equals(idRequerimiento)) {
				listadoRequerimiento.remove(i);
				i=listadoRequerimiento.size();
			}
		}
	}
	
	/**
	 * Elimina un ciclo
	 * @param idCiclo Id del ciclo a eleiminar
	 * @param listadoCiclo Listado de ciclos
	 */
	@LogsT({@LogT(date="21/03/2011", taskId=222, idCiclo=2, idPersona=20112, porcentajeRealValorGanado=1, min=2)})
	public void eliminarCiclo(int idCiclo, List<Ciclo> listadoCiclo)
	{
		for (int i = 0; i < listadoCiclo.size(); i++) {
			if (listadoCiclo.get(i).getIdCiclo()==idCiclo) {
				listadoCiclo.remove(i);
				i=listadoCiclo.size();
			}
		}
	}
	
	/**
	 * Agrega un nuevo ciclo a la lista de ciclos
	 * @param idCiclo Id del ciclo a agregar
	 * @param estrategia Estrategia del ciclo
	 * @param planDeDesarrollo Plan de desarrollo del ciclo
	 * @param listadoRequerimiento Listado de requerimientos del ciclo
	 * @param listadoCiclos Listado de ciclos
	 */
	@LogsT({@LogT(date="21/03/2011", taskId=222, idCiclo=2, idPersona=20112, porcentajeRealValorGanado=1, min=2)})
	@LogsD({@LogD(etapa=EtapasDesarrollo.PRUEBAS, tipo=22, idCiclo=2, idPersona=20115)})
	public void agregarCiclo(int idCiclo, String estrategia, String planDeDesarrollo, 
			LinkedList<Requerimiento> listadoRequerimiento,List<Ciclo> listadoCiclos )
	{
		Ciclo ciclo=new Ciclo(idCiclo,estrategia,planDeDesarrollo,listadoRequerimiento);
		listadoCiclos.add(ciclo);
	}
	
}
